package main

import (
	"flag"
	"fmt"
	"os"
	"path/filepath"
)

func main() {
	// 定义命令行参数
	globalFlag := flag.Bool("g", false, "清除全局Cargo缓存")
	flag.Parse()

	if *globalFlag {
		// 清除全局缓存
		clearGlobalCache()
	} else {
		// 获取指定路径
		args := flag.Args()
		if len(args) == 0 {
			fmt.Println("请指定要清除缓存的目录路径")
			os.Exit(1)
		}
		clearLocalCache(args[0])
	}
}

// 获取Cargo主目录
func getCargoHome() string {
	// 优先检查 CARGO_HOME 环境变量
	if cargoHome := os.Getenv("CARGO_HOME"); cargoHome != "" {
		return cargoHome
	}

	// 如果环境变量不存在，则使用默认路径
	home, err := os.UserHomeDir()
	if err != nil {
		fmt.Printf("获取用户主目录失败: %v\n", err)
		os.Exit(1)
	}
	return filepath.Join(home, ".cargo")
}

// 清除全局缓存
func clearGlobalCache() {
	cargoHome := getCargoHome()
	globalCache := filepath.Join(cargoHome, "registry")

	err := os.RemoveAll(globalCache)
	if err != nil {
		fmt.Printf("清除全局缓存失败: %v\n", err)
		os.Exit(1)
	}
	fmt.Println("全局缓存已清除")
}

// 清除本地缓存
func clearLocalCache(path string) {
	// 遍历目录查找target文件夹
	err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		if info.IsDir() && info.Name() == "target" {
			// 检查父目录是否包含Cargo.toml
			parent := filepath.Dir(path)
			if _, err := os.Stat(filepath.Join(parent, "Cargo.toml")); err == nil {
				fmt.Printf("正在清除: %s\n", path)
				if err := os.RemoveAll(path); err != nil {
					return fmt.Errorf("清除 %s 失败: %v", path, err)
				}
			}
		}
		return nil
	})

	if err != nil {
		fmt.Printf("清除缓存时发生错误: %v\n", err)
		os.Exit(1)
	}
	fmt.Println("本地缓存清除完成")
}
